package com.weiiew.itemservice.controller;

import com.example.feignapi.client.BuildClient;
import com.example.feignapi.client.ItemTypeClient;
import com.example.feignapi.client.RecipeClient;
import com.weiiew.common.GatawayAccess.GatewayAccess;
import com.weiiew.common.Translation.TransApi;
import com.weiiew.common.entity.dto.Item;
import com.weiiew.common.entity.qo.ItemQo;
import com.weiiew.itemservice.service.ItemServiceImpl;
import com.weiiew.common.utils.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * @Description
 * @Author 魏锴
 * @Date 2024/2/4
 */
@RestController
@RequestMapping("/item")
@RequiredArgsConstructor
public class ItemController {
    private final ItemServiceImpl itemService;
    private final ItemTypeClient itemTypeClient;
    private final RecipeClient recipeClient;
    private final BuildClient buildClient;

    /**
     * 新建物品
     *
     * @param item    物品信息
     * @param version 版本号
     * @return 新建物品是否成功
     */
    @PostMapping("/insert")
    @GatewayAccess(GatewayAccess.GatewayType.MANAGER)
    private ApiResponse insertItem(@RequestBody Item item, @RequestHeader("my-version") Integer version) {
        item.setVersion(version);
        if (item.getEnglishName() == null)
            item.setEnglishName(TransApi.translate(item.getName(), "auto", "en"));
        itemService.insertItem(item, item.getId(), version);
        return ApiResponse.ok("新建物品成功").append("icon", item.getIconUrl());
    }

    /**
     * 修改物品
     *
     * @param item 物品信息
     * @return 保存结果
     */
    @PostMapping("/update")
    @GatewayAccess(GatewayAccess.GatewayType.MANAGER)
    public ApiResponse updateItem(@RequestBody Item item, @RequestHeader("my-version") Integer version) {
        item.setVersion(version);
        System.out.println("item = " + item);
        item.setIconUrl(null); // 禁止修改icon_url
        itemService.updateItem(item, item.getId(), version);
        return ApiResponse.ok("保存物品成功");
    }


    /**
     * 删除物品
     *
     * @param id 物品id
     * @return 删除结果
     */
    @PostMapping("/remove/{id}")
    @GatewayAccess(GatewayAccess.GatewayType.MANAGER)
    public ApiResponse removeItem(@PathVariable Integer id, @RequestHeader("my-version") Integer version) throws Exception {
        if (id < 0) throw new Exception("物品删除失败");
        itemService.removeItem(id, version);
        return ApiResponse.ok("删除物品成功");
    }

    /**
     * 获取物品管理页面初始化需要的数据
     *
     * @param version 版本号
     * @return 物品堆叠数量列表、物品种类列表、物品列表
     */
    @GetMapping("/init")
    @GatewayAccess(value = {GatewayAccess.GatewayType.MANAGER, GatewayAccess.GatewayType.CLIENT})
    public ApiResponse getInitData(@RequestHeader("my-version") Integer version) {
        if (version == null) return ApiResponse.failure("版本号缺失");
        return ApiResponse.ok("获取初始化参数成功")
                .append("sizes", itemService.getItemStackSizes(version))
                .append("types", itemTypeClient.getSimpleItemTypes(version));
    }

    /**
     * 获取物品列表
     *
     * @param qo      查询条件
     * @param version 版本号
     * @return 物品信息
     */
    @PostMapping("/manager/list")
    @GatewayAccess(GatewayAccess.GatewayType.MANAGER)
    public ApiResponse getItemList(ItemQo qo, @RequestHeader("my-version") Integer version) {
        qo.setVersion(version);
//        System.out.println("qo = " + qo);
        if (!qo.check()) return ApiResponse.failure("参数缺失");
        return ApiResponse.ok("获取成功")
                .append("list", itemService.getItemList(qo))
                .append("length", itemService.getItemLength(qo));
    }

    /**
     * 用户端获取物品列表
     * @param version   版本号
     * @param qo        查询条件
     * @return          查询结果
     */
    @PostMapping("/client/list")
    @GatewayAccess(GatewayAccess.GatewayType.CLIENT)
    public ApiResponse getItemList(@RequestHeader("my-version") Integer version, ItemQo qo){
        qo.setVersion(version);
//        System.out.println("qo = " + qo);
//        System.out.println(qo.getNoPageKey());
        if (version == null) return ApiResponse.failure("参数缺失");
        return ApiResponse.ok("获取成功").append("list", itemService.getSimpleItemList(qo));
    }

    /**
     * 返回物品详细信息
     *
     * @param id 物品id
     * @return 物品详细信息
     */
    @GetMapping("/info/{id}")
    @GatewayAccess(GatewayAccess.GatewayType.MANAGER)
    public ApiResponse getItem(@PathVariable Integer id) {
        return ApiResponse.ok("获取成功")
                .append("item", itemService.getItemById(id))
                .append("recipes", recipeClient.getRecipeByProductId(id));//获取合成途径
    }

    /**
     * 返回物品相关配方
     *
     * @param id 物品id
     * @return 物品相关配方
     */
    @GetMapping("/recipe/{id}")
    @GatewayAccess(GatewayAccess.GatewayType.MANAGER)
    public ApiResponse getRelativeRecipe(@PathVariable Integer id) {
        return ApiResponse.ok("获取成功")
                .append("fromRecipe", recipeClient.getRecipeByIngredientId(id))//获得与原料相关的recipe配方
                .append("toRecipe", recipeClient.getRecipeByProductId(id));//获得与产物相关的recipe配方
    }

    /**
     * 返回物品详细信息以及相关配方
     *
     * @param id 物品id
     * @return 物品详细信息以及相关配方
     */
    @GetMapping("/detail/{id}")
    @GatewayAccess({GatewayAccess.GatewayType.MANAGER, GatewayAccess.GatewayType.CLIENT})
    public ApiResponse getDetailItem(@PathVariable Integer id) {
        try {
            return ApiResponse.ok("获取成功")
                    .append("item", itemService.getItemVOById(id))//物品信息
                    .append("fromRecipe", recipeClient.getRecipeByIngredientId(id)) //获得与原料相关的recipe配方
                    .append("toRecipe", recipeClient.getRecipeByProductId(id)) //获得与原料相关的recipe配方
                    .append("build", buildClient.getBuildingsByCostId(id)); // 获取与建材相关的build建筑
        } catch (Exception e) {
            e.printStackTrace();
            return ApiResponse.failure("获取失败");
        }
    }

    @GetMapping("/icon")
    @GatewayAccess(GatewayAccess.GatewayType.CLIENT)
    public ApiResponse getItemIconList(@RequestHeader("my-version") Integer version){
        return ApiResponse.ok("获取成功").append("list", itemService.getItemIconList(version));
    }

    @GetMapping("/list/use")
    @GatewayAccess(GatewayAccess.GatewayType.CLIENT)
    public ApiResponse getItemListOrderByUse(@RequestHeader("my-version") Integer version){
        return ApiResponse.ok("获取列表成功").append("list", itemService.getItemListOrderByUse(version));
    }

    /**
     * 计算页面的配方选择标签页的物品列表及其默认配方id
     *
     * @param version 版本号
     * @param name    搜索物品名
     * @return 物品列表及其默认配方id
     */
    @PostMapping("/cal/list")
    @GatewayAccess(GatewayAccess.GatewayType.CLIENT)
    public ApiResponse getCalRecipeItemList(@RequestHeader("my-version") Integer version, String name){
        return ApiResponse.ok("获取列表成功")
                .append("list", itemService.getCalRecipeItemList(version, name));
    }

    /**
     * 现已关闭
     * 用于测试模糊删除是否起作用
     * @return 删除结果
     */
//    @RequestMapping("/cache/clear")
    public ApiResponse clearCache(){
        System.out.println("清楚缓存");
        itemService.clearCache(1);
        return ApiResponse.ok("清楚缓存成功");
    }
}